# 导入需要的库
import numpy as np
import matplotlib.pyplot as plt
# 定义输入数据x,和目标数据y的数组
x,y=[],[]
# 遍历数据集,变量sample就是一个个样本
for sample in open("./prices.txt","r"):
# 由于数据是以,隔开的所以使用Python中的split方法并将,作为参数传入
    _x,_y=sample.split(",")
#将字符串转换为浮点数
    x.append(float(_x))
    y.append(float(_y))
#读取完后将数组砖混为Numpy数组以方便进一步处理
x,y=np.array(x),np.array(y)
#标准化
x = ( x - x.mean() ) / x.std()
# 将原始数据以散点图的形式输出
plt.figure()
plt.scatter(x,y,c="g",s=6)
plt.show()
#在(-2~4)这个区间上取100个点作为画图的基础
x0 = np.linspace(-2,4,100)
#利用numpy的函数定义训练并返回多项式回归函数模型的函数
# deg参数代表着模型参数中的n,亦即多项式的次数
#返回的模型能够更具输入的x(默认为x0),返回相应的预测值y
def get_mode(deg):
    return lambda input_x=x0:np.polyval(np.polyfit(x,y,deg),input_x)
# 根据参数n,输入的x,y返回相对应的损失
def get_cost(deg,input_x,input_y):
    return 0.5 * ((get_mode(deg)(input_x)-input_y) ** 2).sum()
#定义测试参数集并根据它进行各种实验
test_set = (1,4,10)
for d in test_set:
    # 输出相应的损失
    print(get_cost(d,x,y))
# 画出相应的图像
plt.scatter(x,y,c="g",s=20)
for d in test_set:
    plt.plot(x0,get_mode(d)(),label="degree={}".format(d))
#将横轴,纵轴的范围分别控制在(-2~4)、(10 ** 5,8*10**5)
plt.xlim(-2,4)
plt.ylim(1e5,8e5)
#调用legend方法石渠县对应的label正确显示
plt.legend()
plt.show()